{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0b21e6e9",
   "metadata": {},
   "source": [
    "# 0. Import Libraries"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2370c44",
   "metadata": {},
   "source": [
    "!pip install pandas\n",
    "!pip install matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a5101882",
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import tensorflow.keras as keras\n",
    "from tensorflow.keras import backend as K\n",
    "from tensorflow.keras.layers import *\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from scipy.io import loadmat\n",
    "from scipy.io import savemat\n",
    "import math\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9a461153",
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy.random import seed\n",
    "seed(0)\n",
    "tf.random.set_seed(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "90e0a62c",
   "metadata": {},
   "source": [
    "# 1. Define Something in Advance"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "52694299",
   "metadata": {},
   "source": [
    "# 2. Initialize the Grid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "cb09ad87",
   "metadata": {},
   "outputs": [],
   "source": [
    "delta = 0.05\n",
    "x_domain = np.arange(0, 1+delta, delta)\n",
    "y_domain = np.arange(0, 1+delta, delta)\n",
    "x_mesh,y_mesh = np.meshgrid(x_domain, y_domain)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aff173b7",
   "metadata": {},
   "source": [
    "# 3. Define Physical Info."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45a38f16",
   "metadata": {},
   "source": [
    "    suppose: \n",
    "    x = x[0];\n",
    "    y = x[1];\n",
    "    uxy = x[2]; \n",
    "    dudx = x[3];\n",
    "    dudy = x[4];\n",
    "    du2dx2 = x[5];\n",
    "    du2dy2 = x[6];\n",
    "    du2dxdy = x[7];\n",
    "    laplace = x[8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "143fcddc",
   "metadata": {},
   "outputs": [],
   "source": [
    "governing_equation_components = []\n",
    "governing_equation_components.append(Lambda(lambda x: x[5]))\n",
    "governing_equation_components.append(Lambda(lambda x: x[6]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "040914e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "governing_equation_mask = x_mesh*0\n",
    "governing_equation_mask[1:-1,1:-1] = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6eec9434",
   "metadata": {},
   "outputs": [],
   "source": [
    "fx = governing_equation_mask*(x_mesh*0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d2faaa4a",
   "metadata": {},
   "outputs": [],
   "source": [
    "estimate_equation_form = False\n",
    "equation_component_combination = [1.0,5.0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a647c8f2",
   "metadata": {},
   "source": [
    "# 4. Define the Observations"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee89c021",
   "metadata": {},
   "source": [
    "    suppose: \n",
    "    x = x[0];\n",
    "    y = x[1];\n",
    "    uxy = x[2]; \n",
    "    dudx = x[3];\n",
    "    dudy = x[4];\n",
    "    du2dx2 = x[5];\n",
    "    du2dy2 = x[6];\n",
    "    du2dxdy = x[7];\n",
    "    laplace = x[8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "28d1ac32",
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_components = []\n",
    "observation_components.append(Lambda(lambda x: x[2]))\n",
    "observation_components.append(Lambda(lambda x: x[3]))\n",
    "observation_components.append(Lambda(lambda x: x[4]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41dc785c",
   "metadata": {},
   "source": [
    "    format: [x,y,combination,value]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ff1e2ce1",
   "metadata": {},
   "outputs": [],
   "source": [
    "truth_smooth = loadmat('data.mat')['uxy_list'][-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "27ef0d34",
   "metadata": {},
   "outputs": [],
   "source": [
    "truth_data = loadmat('data.mat')['uxy_list'][-1] + np.random.normal(loc=0.0, scale=0.2, size=x_mesh.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9b5560ac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(21, 21)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "truth_data.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2d64204",
   "metadata": {},
   "source": [
    "observation_data = []\n",
    "\n",
    "theta_list = np.linspace(0,np.pi*2,800)\n",
    "for theta in theta_list:\n",
    "    x = x_theta(theta)\n",
    "    y = y_theta(theta)\n",
    "    comb = [1,0,0]\n",
    "    v = U(x,y)\n",
    "    observation_data.append([x,y,comb,v])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d02e9dae",
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_data = []\n",
    "for x,y,v in zip(x_mesh.ravel(),y_mesh.ravel(),truth_data.ravel()):\n",
    "    comb = [1,0,0]\n",
    "    observation_data.append([x,y,comb,v])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2270ab5c",
   "metadata": {},
   "source": [
    "# 5. Define PICN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c05580e3",
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_x_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[-1.0/delta]], [[1.0/delta]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "bb1cf4d3",
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_x2_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[1.0/delta**2]], [[-2.0/delta**2]], [[1.0/delta**2]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "2ed662f8",
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_y_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[-1.0/delta]]], [[[1.0/delta]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "bbbbf69d",
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_y2_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[1.0/delta**2]]], [[[-2.0/delta**2]]], [[[1.0/delta**2]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "7f852ff4",
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_xy_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[1.0/delta**2]], [[-1.0/delta**2]]], [[[-1.0/delta**2]], [[1.0/delta**2]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "4fac796a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def laplace_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[0]], [[1.0/delta**2]], [[0]]], [[[1.0/delta**2]], [[-4.0/delta**2]], [[1.0/delta**2]]], [[[0]], [[1.0/delta**2]], [[0]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "858a79b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "inputs = [keras.layers.Input(shape=(1,1,1)),\n",
    "          keras.layers.Input(shape=(len(y_domain),len(x_domain),1)),\n",
    "          keras.layers.Input(shape=(len(y_domain),len(x_domain),1)),\n",
    "          keras.layers.Input(shape=(len(observation_data),len(observation_components)*4)),\n",
    "          keras.layers.Input(shape=(len(y_domain),len(x_domain),1))]\n",
    "\n",
    "hidden_field = keras.layers.Conv2DTranspose(filters=1, \n",
    "                                            kernel_size=[len(y_domain)+4,len(x_domain)+4], \n",
    "                                            activation='linear')(inputs[0])\n",
    "coordinates_x = inputs[1]\n",
    "coordinates_y = inputs[2]\n",
    "field = keras.layers.Conv2D(filters=1, \n",
    "                            kernel_size=3, \n",
    "                            padding='valid', \n",
    "                            activation=Lambda(lambda x: x))(hidden_field)\n",
    "gradient_x_field = keras.layers.Conv2D(filters=1, \n",
    "                                     kernel_size=[1,2], \n",
    "                                     padding='valid',\n",
    "                                     use_bias=False,\n",
    "                                     trainable=False,\n",
    "                                     kernel_initializer=gradient_x_kernal_init)(field)\n",
    "gradient_x2_field = keras.layers.Conv2D(filters=1, \n",
    "                                       kernel_size=[1,3], \n",
    "                                       padding='valid',\n",
    "                                       use_bias=False,\n",
    "                                       trainable=False,\n",
    "                                       kernel_initializer=gradient_x2_kernal_init)(field)\n",
    "gradient_y_field = keras.layers.Conv2D(filters=1, \n",
    "                                     kernel_size=[2,1], \n",
    "                                     padding='valid',\n",
    "                                     use_bias=False,\n",
    "                                     trainable=False,\n",
    "                                     kernel_initializer=gradient_y_kernal_init)(field)\n",
    "gradient_y2_field = keras.layers.Conv2D(filters=1, \n",
    "                                       kernel_size=[3,1], \n",
    "                                       padding='valid',\n",
    "                                       use_bias=False,\n",
    "                                       trainable=False,\n",
    "                                       kernel_initializer=gradient_y2_kernal_init)(field)\n",
    "gradient_xy_field = keras.layers.Conv2D(filters=1, \n",
    "                                       kernel_size=[2,2], \n",
    "                                       padding='valid',\n",
    "                                       use_bias=False,\n",
    "                                       trainable=False,\n",
    "                                       kernel_initializer=gradient_xy_kernal_init)(field)\n",
    "laplace_field = keras.layers.Conv2D(filters=1, \n",
    "                                       kernel_size=[3,3], \n",
    "                                       padding='valid',\n",
    "                                       use_bias=False,\n",
    "                                       trainable=False,\n",
    "                                       kernel_initializer=laplace_kernal_init)(field)\n",
    "phycial_fields = [coordinates_x,\n",
    "                  coordinates_y,\n",
    "                  field[:,1:-1,1:-1,:],\n",
    "                  gradient_x_field[:,1:-1,1:,:],\n",
    "                  gradient_y_field[:,1:,1:-1,:],\n",
    "                  gradient_x2_field[:,1:-1,:,:],\n",
    "                  gradient_y2_field[:,:,1:-1,:],\n",
    "                  gradient_xy_field[:,1:,1:,:],\n",
    "                  laplace_field]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "f9985fe3",
   "metadata": {},
   "outputs": [],
   "source": [
    "if estimate_equation_form==True:\n",
    "    tf_governing_equation_components = [component(phycial_fields) for component in governing_equation_components]\n",
    "    concat_equation_components = Lambda(lambda x: tf.concat(x,axis=-1))(tf_governing_equation_components)\n",
    "    governing_equation = keras.layers.Conv2D(filters=1, \n",
    "                                             kernel_size=[1,1], \n",
    "                                             padding='valid',\n",
    "                                             use_bias=False)(concat_equation_components)*inputs[4]\n",
    "else:\n",
    "    tf_weighted_governing_equation_components = [weight*component(phycial_fields) for [weight,component] in zip(equation_component_combination,governing_equation_components)]\n",
    "    concat_weighted_equation_components = Lambda(lambda x: tf.concat(x,axis=-1))(tf_weighted_governing_equation_components)\n",
    "    governing_equation = Lambda(lambda x: tf.reduce_sum(x,axis=-1,keepdims=True))(concat_weighted_equation_components)*inputs[4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "0acc5d42",
   "metadata": {},
   "outputs": [],
   "source": [
    "tf_observation_components = [component(phycial_fields) for component in observation_components]\n",
    "concat_observation_components = Lambda(lambda x: tf.concat(x,axis=-1))(tf_observation_components)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "ccbe78d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "left_x_position_index_list = []\n",
    "right_x_position_index_list = []\n",
    "left_x_position_weight_list = []\n",
    "right_x_position_weight_list = []\n",
    "\n",
    "bottom_y_position_index_list = []\n",
    "top_y_position_index_list = []\n",
    "bottom_y_position_weight_list = []\n",
    "top_y_position_weight_list = []\n",
    "\n",
    "\n",
    "for data in observation_data:\n",
    "    \n",
    "    left_x_position_index = int(np.floor((data[0] - x_domain[0])/delta))\n",
    "    right_x_position_index = left_x_position_index + 1\n",
    "    left_x_position_weight = 1-(data[0] - (x_domain[0]+delta*left_x_position_index))/delta\n",
    "    right_x_position_weight = 1-left_x_position_weight\n",
    "    \n",
    "    bottom_y_position_index = int(np.floor((data[1] - y_domain[0])/delta))\n",
    "    top_y_position_index = bottom_y_position_index + 1\n",
    "    bottom_y_position_weight = 1-(data[1] - (y_domain[0]+delta*bottom_y_position_index))/delta\n",
    "    top_y_position_weight = 1-bottom_y_position_weight\n",
    "    \n",
    "    if data[0] <= x_domain[0] + 1e-8:\n",
    "        left_x_position_index = 0\n",
    "        right_x_position_index = 1\n",
    "        left_x_position_weight = 1\n",
    "        right_x_position_weight = 0\n",
    "    if data[0] >= x_domain[-1] - 1e-8:\n",
    "        left_x_position_index = len(x_domain)-2\n",
    "        right_x_position_index = len(x_domain)-1\n",
    "        left_x_position_weight = 0\n",
    "        right_x_position_weight = 1\n",
    "    if data[1] <= y_domain[0] + 1e-8:\n",
    "        bottom_y_position_index = 0\n",
    "        top_y_position_index = 1\n",
    "        bottom_y_position_weight = 1\n",
    "        top_y_position_weight = 0\n",
    "    if data[1] >= y_domain[-1] - 1e-8:\n",
    "        bottom_y_position_index = len(y_domain)-2\n",
    "        top_y_position_index = len(y_domain)-1\n",
    "        bottom_y_position_weight = 0\n",
    "        top_y_position_weight = 1\n",
    "    \n",
    "    left_x_position_index_list.append(left_x_position_index)\n",
    "    right_x_position_index_list.append(right_x_position_index)\n",
    "    left_x_position_weight_list.append(left_x_position_weight)\n",
    "    right_x_position_weight_list.append(right_x_position_weight)\n",
    "\n",
    "    bottom_y_position_index_list.append(bottom_y_position_index)\n",
    "    top_y_position_index_list.append(top_y_position_index)\n",
    "    bottom_y_position_weight_list.append(bottom_y_position_weight)\n",
    "    top_y_position_weight_list.append(top_y_position_weight)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "07f61683",
   "metadata": {},
   "outputs": [],
   "source": [
    "left_bottom_indices = tf.constant([[0,y,x] for x,y in zip(left_x_position_index_list,bottom_y_position_index_list)])\n",
    "left_top_indices = tf.constant([[0,y,x] for x,y in zip(left_x_position_index_list,top_y_position_index_list)])\n",
    "right_bottom_indices = tf.constant([[0,y,x] for x,y in zip(right_x_position_index_list,bottom_y_position_index_list)])\n",
    "right_top_indices = tf.constant([[0,y,x] for x,y in zip(right_x_position_index_list,top_y_position_index_list)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "5d7fafb6",
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_data_left_bottom_part = Lambda(lambda x: tf.gather_nd(x,left_bottom_indices))(concat_observation_components)\n",
    "observation_data_left_top_part = Lambda(lambda x: tf.gather_nd(x,left_top_indices))(concat_observation_components)\n",
    "observation_data_right_bottom_part = Lambda(lambda x: tf.gather_nd(x,right_bottom_indices))(concat_observation_components)\n",
    "observation_data_right_top_part = Lambda(lambda x: tf.gather_nd(x,right_top_indices))(concat_observation_components)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "b31ebd19",
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_data_four_part = Lambda(lambda x: tf.expand_dims(tf.concat(x,axis=-1),axis=0))([observation_data_left_bottom_part,observation_data_left_top_part,observation_data_right_bottom_part,observation_data_right_top_part])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "1459fbc8",
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_data_interpolation_weights = np.expand_dims(\n",
    "np.asarray([np.concatenate([(np.asarray([observation_data[i][2][j] for j in range(len(observation_components))]))*left_x_position_weight_list[i]*bottom_y_position_weight_list[i],\n",
    " (np.asarray([observation_data[i][2][j] for j in range(len(observation_components))]))*left_x_position_weight_list[i]*top_y_position_weight_list[i],\n",
    " (np.asarray([observation_data[i][2][j] for j in range(len(observation_components))]))*right_x_position_weight_list[i]*bottom_y_position_weight_list[i],\n",
    " (np.asarray([observation_data[i][2][j] for j in range(len(observation_components))]))*right_x_position_weight_list[i]*top_y_position_weight_list[i]],axis=-1) for i in range(len(observation_data))]),\n",
    "    axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "e39b91a6",
   "metadata": {},
   "outputs": [],
   "source": [
    "observations = Lambda(lambda x: tf.reduce_sum(x[0]*x[1],axis=-1))([inputs[3][0,:,:],observation_data_four_part])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "c2c9be15",
   "metadata": {},
   "outputs": [],
   "source": [
    "pde_model = keras.Model(inputs=inputs[:3], outputs=phycial_fields)\n",
    "pde_model_train = keras.Model(inputs=inputs, outputs=[governing_equation,observations])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8dbf6c1e",
   "metadata": {},
   "source": [
    "# 6. Prepare the Training Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "e13964ba",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 1, 1, 1)\n"
     ]
    }
   ],
   "source": [
    "unit_constant = np.asarray([[[[1.0]]]],dtype=np.float32)\n",
    "training_input_data_0 = unit_constant\n",
    "print(training_input_data_0.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "03abae6b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 21, 21, 1)\n"
     ]
    }
   ],
   "source": [
    "training_input_data_1 = np.expand_dims(x_mesh.astype(np.float32),axis=[0,-1])\n",
    "print(training_input_data_1.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "bfb2a398",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 21, 21, 1)\n"
     ]
    }
   ],
   "source": [
    "training_input_data_2 = np.expand_dims(y_mesh.astype(np.float32),axis=[0,-1])\n",
    "print(training_input_data_2.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "1e42e21c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 441, 12)\n"
     ]
    }
   ],
   "source": [
    "training_input_data_3 = observation_data_interpolation_weights.astype(np.float32)\n",
    "print(training_input_data_3.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "d7a8b07b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 21, 21, 1)\n"
     ]
    }
   ],
   "source": [
    "training_input_data_4 = np.expand_dims(governing_equation_mask.astype(np.float32),axis=[0,-1])\n",
    "print(training_input_data_2.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "83251413",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 21, 21, 1)\n"
     ]
    }
   ],
   "source": [
    "training_label_data_0 = np.expand_dims(fx.astype(np.float32),axis=[0,-1])\n",
    "print(training_label_data_0.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "09992122",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 441)\n"
     ]
    }
   ],
   "source": [
    "training_label_data_1 = np.expand_dims(np.asarray([data[3] for data in observation_data]),axis=[0])\n",
    "print(training_label_data_1.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "3ae901b2",
   "metadata": {},
   "outputs": [],
   "source": [
    "training_input_data = [training_input_data_0,training_input_data_1,training_input_data_2,training_input_data_3,training_input_data_4]\n",
    "training_label_data = [training_label_data_0,training_label_data_1]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d3ecd9a",
   "metadata": {},
   "source": [
    "# 7. Train the Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "da87972b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['loss', 'tf_op_layer_Mul_2_loss', 'lambda_14_loss']\n"
     ]
    }
   ],
   "source": [
    "pde_model_train.compile(optimizer=keras.optimizers.Adam(), loss=\"mse\")\n",
    "pde_model_train.save_weights('picn_initial_weights.h5')\n",
    "temp_history = pde_model_train.fit(x=training_input_data, y=training_label_data, epochs=1, verbose=0)\n",
    "history_keys = []\n",
    "for key in temp_history.history.keys():\n",
    "    history_keys.append(key)\n",
    "print(history_keys)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "daa7785a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def record_predictions():\n",
    "    [_, _, uxy, dudx, dudy, d2udx2, d2udy2, d2udxdy, laplace] = pde_model.predict(training_input_data[:3])\n",
    "    uxy_list.append(uxy[:,:,:,0])\n",
    "    dudx_list.append(dudx[:,:,:,0])\n",
    "    dudy_list.append(dudy[:,:,:,0])\n",
    "    d2udx2_list.append(d2udx2[:,:,:,0])\n",
    "    d2udy2_list.append(d2udy2[:,:,:,0])\n",
    "    d2udxdy_list.append(d2udxdy[:,:,:,0])\n",
    "    laplace_list.append(laplace[:,:,:,0])\n",
    "\n",
    "class Per_X_Epoch_Record(tf.keras.callbacks.Callback):\n",
    "    def __init__(self, record_interval, verbose=1):\n",
    "        super(tf.keras.callbacks.Callback, self).__init__()\n",
    "        self.total_loss = history_keys[0]\n",
    "        self.domain_loss = history_keys[1]\n",
    "        self.bdc_loss = history_keys[2]\n",
    "        self.previous_total_loss = 9999999\n",
    "        self.record_interval = record_interval;\n",
    "        self.verbose = verbose\n",
    "\n",
    "    def on_epoch_end(self, epoch, logs={}):\n",
    "        \n",
    "        if epoch%self.record_interval == 0:\n",
    "            \n",
    "            current_total_loss = logs.get(self.total_loss)\n",
    "            current_domain_loss = logs.get(self.domain_loss)\n",
    "            current_bdc_loss = logs.get(self.bdc_loss)\n",
    "            \n",
    "            epoch_number_list.append(epoch)\n",
    "            total_loss_list.append(current_total_loss)\n",
    "            domain_loss_list.append(current_domain_loss)\n",
    "            boundary_loss_list.append(current_bdc_loss)\n",
    "        \n",
    "            if current_total_loss < self.previous_total_loss:\n",
    "                self.previous_total_loss = current_total_loss\n",
    "                pde_model_train.save_weights('picn_best_weights.h5')\n",
    "            \n",
    "            if self.verbose > 0:\n",
    "                print(\"epoch: {:10.5f} | total_loss: {:10.5f} | domain_loss: {:10.5f} | bdc_loss: {:10.5f}\".format(epoch,current_total_loss,current_domain_loss,current_bdc_loss))\n",
    "        \n",
    "            # evaluate the errors in f-domain\n",
    "            record_predictions()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "2dfa38e9",
   "metadata": {},
   "outputs": [],
   "source": [
    "callbacks = [\n",
    "    Per_X_Epoch_Record(record_interval=200,verbose=1),\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "09eccbbe",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch:    0.00000 | total_loss:  443.30057 | domain_loss: 44271.01953 | bdc_loss:    0.59634\n",
      "epoch:  200.00000 | total_loss:   29.52014 | domain_loss: 2899.77661 | bdc_loss:    0.52765\n",
      "epoch:  400.00000 | total_loss:    7.29487 | domain_loss:  682.82709 | bdc_loss:    0.47131\n",
      "epoch:  600.00000 | total_loss:    3.32544 | domain_loss:  290.40216 | bdc_loss:    0.42567\n",
      "epoch:  800.00000 | total_loss:    1.91612 | domain_loss:  153.17165 | bdc_loss:    0.38829\n",
      "epoch: 1000.00000 | total_loss:    1.26696 | domain_loss:   91.30827 | bdc_loss:    0.35745\n",
      "epoch: 1200.00000 | total_loss:    0.92221 | domain_loss:   59.35229 | bdc_loss:    0.33201\n",
      "epoch: 1400.00000 | total_loss:    0.71702 | domain_loss:   40.89738 | bdc_loss:    0.31115\n",
      "epoch: 1600.00000 | total_loss:    0.58300 | domain_loss:   29.17085 | bdc_loss:    0.29423\n",
      "epoch: 1800.00000 | total_loss:    0.48984 | domain_loss:   21.19497 | bdc_loss:    0.28070\n",
      "epoch: 2000.00000 | total_loss:    0.42295 | domain_loss:   15.55748 | bdc_loss:    0.27008\n",
      "epoch: 2200.00000 | total_loss:    0.37443 | domain_loss:   11.51236 | bdc_loss:    0.26193\n",
      "epoch: 2400.00000 | total_loss:    0.33938 | domain_loss:    8.60892 | bdc_loss:    0.25584\n",
      "epoch: 2600.00000 | total_loss:    0.31430 | domain_loss:    6.53796 | bdc_loss:    0.25144\n",
      "epoch: 2800.00000 | total_loss:    0.29656 | domain_loss:    5.06912 | bdc_loss:    0.24836\n",
      "epoch: 3000.00000 | total_loss:    0.28408 | domain_loss:    4.02600 | bdc_loss:    0.24628\n",
      "epoch: 3200.00000 | total_loss:    0.27524 | domain_loss:    3.27534 | bdc_loss:    0.24493\n",
      "epoch: 3400.00000 | total_loss:    0.26885 | domain_loss:    2.72050 | bdc_loss:    0.24408\n",
      "epoch: 3600.00000 | total_loss:    0.26407 | domain_loss:    2.29502 | bdc_loss:    0.24356\n",
      "epoch: 3800.00000 | total_loss:    0.26035 | domain_loss:    1.95566 | bdc_loss:    0.24322\n",
      "epoch: 4000.00000 | total_loss:    0.25733 | domain_loss:    1.67550 | bdc_loss:    0.24300\n",
      "epoch: 4200.00000 | total_loss:    0.25480 | domain_loss:    1.43832 | bdc_loss:    0.24284\n",
      "epoch: 4400.00000 | total_loss:    0.25262 | domain_loss:    1.23412 | bdc_loss:    0.24271\n",
      "epoch: 4600.00000 | total_loss:    0.25073 | domain_loss:    1.05659 | bdc_loss:    0.24259\n",
      "epoch: 4800.00000 | total_loss:    0.24906 | domain_loss:    0.90149 | bdc_loss:    0.24247\n",
      "epoch: 5000.00000 | total_loss:    0.24759 | domain_loss:    0.76575 | bdc_loss:    0.24236\n",
      "epoch: 5200.00000 | total_loss:    0.24629 | domain_loss:    0.64702 | bdc_loss:    0.24224\n",
      "epoch: 5400.00000 | total_loss:    0.24514 | domain_loss:    0.54342 | bdc_loss:    0.24212\n",
      "epoch: 5600.00000 | total_loss:    0.24412 | domain_loss:    0.45343 | bdc_loss:    0.24200\n",
      "epoch: 5800.00000 | total_loss:    0.24322 | domain_loss:    0.37568 | bdc_loss:    0.24188\n",
      "epoch: 6000.00000 | total_loss:    0.24242 | domain_loss:    0.30897 | bdc_loss:    0.24175\n",
      "epoch: 6200.00000 | total_loss:    0.24172 | domain_loss:    0.25221 | bdc_loss:    0.24162\n",
      "epoch: 6400.00000 | total_loss:    0.24111 | domain_loss:    0.20437 | bdc_loss:    0.24148\n",
      "epoch: 6600.00000 | total_loss:    0.24057 | domain_loss:    0.16437 | bdc_loss:    0.24133\n",
      "epoch: 6800.00000 | total_loss:    0.24008 | domain_loss:    0.13136 | bdc_loss:    0.24118\n",
      "epoch: 7000.00000 | total_loss:    0.23966 | domain_loss:    0.10443 | bdc_loss:    0.24102\n",
      "epoch: 7200.00000 | total_loss:    0.23927 | domain_loss:    0.08272 | bdc_loss:    0.24085\n",
      "epoch: 7400.00000 | total_loss:    0.23892 | domain_loss:    0.06554 | bdc_loss:    0.24068\n",
      "epoch: 7600.00000 | total_loss:    0.23860 | domain_loss:    0.05216 | bdc_loss:    0.24049\n",
      "epoch: 7800.00000 | total_loss:    0.23830 | domain_loss:    0.04199 | bdc_loss:    0.24029\n",
      "epoch: 8000.00000 | total_loss:    0.23802 | domain_loss:    0.03445 | bdc_loss:    0.24007\n",
      "epoch: 8200.00000 | total_loss:    0.23774 | domain_loss:    0.02912 | bdc_loss:    0.23985\n",
      "epoch: 8400.00000 | total_loss:    0.23746 | domain_loss:    0.02531 | bdc_loss:    0.23960\n",
      "epoch: 8600.00000 | total_loss:    0.23718 | domain_loss:    0.02329 | bdc_loss:    0.23934\n",
      "epoch: 8800.00000 | total_loss:    0.23689 | domain_loss:    0.02242 | bdc_loss:    0.23906\n",
      "epoch: 9000.00000 | total_loss:    0.23657 | domain_loss:    0.02068 | bdc_loss:    0.23876\n",
      "epoch: 9200.00000 | total_loss:    0.23624 | domain_loss:    0.02035 | bdc_loss:    0.23842\n",
      "epoch: 9400.00000 | total_loss:    0.23589 | domain_loss:    0.02035 | bdc_loss:    0.23806\n",
      "epoch: 9600.00000 | total_loss:    0.23550 | domain_loss:    0.02081 | bdc_loss:    0.23767\n",
      "epoch: 9800.00000 | total_loss:    0.23507 | domain_loss:    0.02121 | bdc_loss:    0.23723\n",
      "epoch: 10000.00000 | total_loss:    0.23458 | domain_loss:    0.02048 | bdc_loss:    0.23674\n",
      "epoch: 10200.00000 | total_loss:    0.23405 | domain_loss:    0.02106 | bdc_loss:    0.23620\n",
      "epoch: 10400.00000 | total_loss:    0.23345 | domain_loss:    0.02077 | bdc_loss:    0.23559\n",
      "epoch: 10600.00000 | total_loss:    0.23277 | domain_loss:    0.02116 | bdc_loss:    0.23491\n",
      "epoch: 10800.00000 | total_loss:    0.23202 | domain_loss:    0.02428 | bdc_loss:    0.23412\n",
      "epoch: 11000.00000 | total_loss:    0.23112 | domain_loss:    0.02403 | bdc_loss:    0.23321\n",
      "epoch: 11200.00000 | total_loss:    0.23005 | domain_loss:    0.02081 | bdc_loss:    0.23217\n",
      "epoch: 11400.00000 | total_loss:    0.22884 | domain_loss:    0.02065 | bdc_loss:    0.23094\n",
      "epoch: 11600.00000 | total_loss:    0.22741 | domain_loss:    0.02156 | bdc_loss:    0.22949\n",
      "epoch: 11800.00000 | total_loss:    0.22569 | domain_loss:    0.01963 | bdc_loss:    0.22777\n",
      "epoch: 12000.00000 | total_loss:    0.22363 | domain_loss:    0.01901 | bdc_loss:    0.22570\n",
      "epoch: 12200.00000 | total_loss:    0.22135 | domain_loss:    0.03691 | bdc_loss:    0.22321\n",
      "epoch: 12400.00000 | total_loss:    0.21816 | domain_loss:    0.01625 | bdc_loss:    0.22020\n",
      "epoch: 12600.00000 | total_loss:    0.21454 | domain_loss:    0.01658 | bdc_loss:    0.21654\n",
      "epoch: 12800.00000 | total_loss:    0.21015 | domain_loss:    0.01774 | bdc_loss:    0.21210\n",
      "epoch: 13000.00000 | total_loss:    0.20480 | domain_loss:    0.01441 | bdc_loss:    0.20672\n",
      "epoch: 13200.00000 | total_loss:    0.19835 | domain_loss:    0.01274 | bdc_loss:    0.20022\n",
      "epoch: 13400.00000 | total_loss:    0.19061 | domain_loss:    0.00701 | bdc_loss:    0.19246\n",
      "epoch: 13600.00000 | total_loss:    0.18150 | domain_loss:    0.00595 | bdc_loss:    0.18327\n",
      "epoch: 13800.00000 | total_loss:    0.17089 | domain_loss:    0.00462 | bdc_loss:    0.17257\n",
      "epoch: 14000.00000 | total_loss:    0.15898 | domain_loss:    0.00444 | bdc_loss:    0.16054\n",
      "epoch: 14200.00000 | total_loss:    0.14579 | domain_loss:    0.00296 | bdc_loss:    0.14723\n",
      "epoch: 14400.00000 | total_loss:    0.13170 | domain_loss:    0.00290 | bdc_loss:    0.13300\n",
      "epoch: 14600.00000 | total_loss:    0.11708 | domain_loss:    0.00284 | bdc_loss:    0.11823\n",
      "epoch: 14800.00000 | total_loss:    0.10263 | domain_loss:    0.00504 | bdc_loss:    0.10361\n",
      "epoch: 15000.00000 | total_loss:    0.08884 | domain_loss:    0.00411 | bdc_loss:    0.08970\n",
      "epoch: 15200.00000 | total_loss:    0.07640 | domain_loss:    0.00094 | bdc_loss:    0.07717\n",
      "epoch: 15400.00000 | total_loss:    0.06560 | domain_loss:    0.00592 | bdc_loss:    0.06620\n",
      "epoch: 15600.00000 | total_loss:    0.05654 | domain_loss:    0.00058 | bdc_loss:    0.05711\n",
      "epoch: 15800.00000 | total_loss:    0.04934 | domain_loss:    0.00043 | bdc_loss:    0.04983\n",
      "epoch: 16000.00000 | total_loss:    0.04385 | domain_loss:    0.00033 | bdc_loss:    0.04429\n",
      "epoch: 16200.00000 | total_loss:    0.03979 | domain_loss:    0.00035 | bdc_loss:    0.04019\n",
      "epoch: 16400.00000 | total_loss:    0.03691 | domain_loss:    0.00041 | bdc_loss:    0.03727\n",
      "epoch: 16600.00000 | total_loss:    0.03494 | domain_loss:    0.00225 | bdc_loss:    0.03527\n",
      "epoch: 16800.00000 | total_loss:    0.03359 | domain_loss:    0.00023 | bdc_loss:    0.03393\n",
      "epoch: 17000.00000 | total_loss:    0.03277 | domain_loss:    0.00663 | bdc_loss:    0.03303\n",
      "epoch: 17200.00000 | total_loss:    0.03261 | domain_loss:    0.05034 | bdc_loss:    0.03243\n",
      "epoch: 17400.00000 | total_loss:    0.03170 | domain_loss:    0.00012 | bdc_loss:    0.03202\n",
      "epoch: 17600.00000 | total_loss:    0.03141 | domain_loss:    0.00013 | bdc_loss:    0.03173\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 17800.00000 | total_loss:    0.03120 | domain_loss:    0.00064 | bdc_loss:    0.03151\n",
      "epoch: 18000.00000 | total_loss:    0.03107 | domain_loss:    0.00344 | bdc_loss:    0.03135\n",
      "epoch: 18200.00000 | total_loss:    0.03091 | domain_loss:    0.00017 | bdc_loss:    0.03122\n",
      "epoch: 18400.00000 | total_loss:    0.03080 | domain_loss:    0.00026 | bdc_loss:    0.03111\n",
      "epoch: 18600.00000 | total_loss:    0.03072 | domain_loss:    0.00141 | bdc_loss:    0.03102\n",
      "epoch: 18800.00000 | total_loss:    0.03064 | domain_loss:    0.00153 | bdc_loss:    0.03093\n",
      "epoch: 19000.00000 | total_loss:    0.03066 | domain_loss:    0.01012 | bdc_loss:    0.03086\n",
      "epoch: 19200.00000 | total_loss:    0.03049 | domain_loss:    0.00010 | bdc_loss:    0.03080\n",
      "epoch: 19400.00000 | total_loss:    0.03046 | domain_loss:    0.00243 | bdc_loss:    0.03074\n",
      "epoch: 19600.00000 | total_loss:    0.03042 | domain_loss:    0.00312 | bdc_loss:    0.03069\n",
      "epoch: 19800.00000 | total_loss:    0.03034 | domain_loss:    0.00011 | bdc_loss:    0.03065\n"
     ]
    }
   ],
   "source": [
    "epoch_number_list = []\n",
    "total_loss_list = []\n",
    "domain_loss_list = []\n",
    "boundary_loss_list = []\n",
    "uxy_list = []\n",
    "dudx_list = []\n",
    "dudy_list = []\n",
    "d2udx2_list = []\n",
    "d2udy2_list = []\n",
    "d2udxdy_list = []\n",
    "laplace_list = []\n",
    "pde_model_train.load_weights('picn_initial_weights.h5')\n",
    "pde_model_train.compile(optimizer=keras.optimizers.Adam(learning_rate=0.0002), loss=\"mse\", loss_weights = [0.01, 0.99])\n",
    "pde_model_train.fit(x=training_input_data, \n",
    "                    y=training_label_data, \n",
    "                    epochs=20000, verbose=0,\n",
    "                    callbacks=callbacks)\n",
    "pde_model_train.load_weights('picn_best_weights.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "983f2f78",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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9OjB9ddfT2FhIStXrqR37950796dWbNmUVJSAkCbNm04efIkAHFxcYwYMQJwjujOmjWLESNG0LZtW15//XVX+8899xydOnXiiiuuYO/eva7yd999l379+tGzZ08mT55MYWEhADNnzuSBBx7g8ssv5+GHH6ZDhw6kp6cD4HA4aN++vSuGs4mPj2fgwIH06NGDiRMnkpWVBcDrr79Oly5d6NGjB9OmTQPg119/pVevXvTq1YvevXuTl5dX+46sRp2SZaXU+0qpNKXUjtPKxyql9iqlEpVSjwForXdrrecAU4EqtxO8UPRr2Y+BkQPJLs7m0+2fujscIYQQQlzC9u7dy+zZs0lISMDf35+XX36ZmTNnsnDhQrZv347NZuOtt946Zzt79uxh2bJlbNy4kaeffhqr1crmzZtZsGABW7duZfHixWzatMlVf9KkSWzatIlt27YRExPD//73P9exffv28fPPP/PKK69w00038emnznzp559/pmfPnoSEhJwznptvvpkXXniBhIQEunfvztNPPw3A888/z9atW0lISODtt98G4KWXXmLevHnEx8ezdu1avLy8atWHZ1PXkeUPgLEVC5RSRmAecBXQBZiulOpSduxaYB2wso7ndbs/9/8zvhZfckty3R2KEEIIIZoArau/zZ59qt7s2WevW1utWrVi8GDn7sI33XQTK1euJDo6mo4dOwJwyy23sGbNmnO2M27cODw8PAgJCSEsLIzU1FTWrl3LxIkT8fb2xt/fn2uvvdZVf8eOHQwdOpTu3bvz6aefsnPnTtexKVOmYDQaAZg1axYfffQRAO+//36NdufLyckhOzub4cOHn/EaevTowY033sgnn3yCyeTcMmTw4ME88MADvP7662RnZ7vK60OdkmWt9Rog87Ti/kCi1vqg1roUWABMKKu/RGs9CLixujaVUrOVUnFKqbjyIfumaEqXKRx74BgPDXrI3aEIIYQQ4hKmajF3w2Qy4XA4ACguLq50zMPDw3XfaDS65htX1/7MmTN544032L59O08++WSl9nx8fFz3W7VqRXh4OKtWreKPP/7gqquuqnG8Vfnhhx+455572Lx5M3379sVms/HYY4/x3nvvUVRUxMCBA9mzZ0+dzlFRQ8xZbgkcrfA4GWiplBqhlHpdKfVfYGl1T9Zav6O1jtVax4aGhjZAePXDbDTj7+Hv7jCE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\n",
      "text/plain": [
       "<Figure size 864x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df=pd.DataFrame({'epoch': epoch_number_list, \n",
    "                 'total_loss': total_loss_list, \n",
    "                 'governing_loss': domain_loss_list, \n",
    "                 'boundary_loss': boundary_loss_list})\n",
    "\n",
    "plt.figure(figsize=(12, 4))\n",
    "plt.plot( 'epoch', 'total_loss', data=df, marker='o', markerfacecolor='red', markersize=2, color='skyblue', linewidth=3)\n",
    "plt.plot( 'epoch', 'governing_loss', data=df, marker='', color='green', linewidth=2, linestyle='dashed')\n",
    "plt.plot( 'epoch', 'boundary_loss', data=df, marker='', color='blue', linewidth=2, linestyle='dashed')\n",
    "plt.legend()\n",
    "#plt.xscale('log')\n",
    "plt.yscale('log')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "06668b77",
   "metadata": {},
   "outputs": [],
   "source": [
    "[x_m, y_m, uxy, dudx, dudy, d2udx2, d2udy2, d2udxdy, laplace] = pde_model.predict(training_input_data[:3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "fb52c8a8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'smooth')"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1296x216 with 8 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1,4,constrained_layout=False, figsize=(18, 3))\n",
    "#\n",
    "ax = axs.ravel()[0]\n",
    "temp = uxy[0,:,:,0]\n",
    "cs = ax.contourf(x_domain, y_domain, uxy[0,:,:,0],20)\n",
    "fig.colorbar(cs, ax=ax, shrink=0.9)\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_title('prediction')\n",
    "#\n",
    "ax = axs.ravel()[1]\n",
    "cs = ax.contourf(x_domain, y_domain, truth_data,20)\n",
    "fig.colorbar(cs, ax=ax, shrink=0.9)\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_title('truth')\n",
    "#\n",
    "ax = axs.ravel()[2]\n",
    "cs = ax.contourf(x_domain, y_domain, uxy[0,:,:,0]-truth_data,20)\n",
    "fig.colorbar(cs, ax=ax, shrink=0.9)\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_title('error')\n",
    "#\n",
    "ax = axs.ravel()[3]\n",
    "cs = ax.contourf(x_domain, y_domain, truth_smooth,20)\n",
    "fig.colorbar(cs, ax=ax, shrink=0.9)\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_title('smooth')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "f54f1a38",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.03064551113301452"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean((uxy[0,:,:,0]-truth_data)**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "6e8a1a7c",
   "metadata": {},
   "outputs": [],
   "source": [
    "picn_process_data = {'x_domain':x_domain,\n",
    "                     'y_domain':y_domain,\n",
    "                     'epoch_number_list':np.asarray(epoch_number_list),\n",
    "                     'total_loss_list':np.asarray(total_loss_list),\n",
    "                     'domain_loss_list':np.asarray(domain_loss_list),\n",
    "                     'boundary_loss_list':np.asarray(boundary_loss_list),\n",
    "                     'truth_smooth':np.asarray(truth_smooth),\n",
    "                     'truth_data':np.asarray(truth_data),\n",
    "                     'uxy_list':np.concatenate(uxy_list,axis=0),\n",
    "                     'dudx_list':np.concatenate(dudx_list,axis=0),\n",
    "                     'dudy_list':np.concatenate(dudy_list,axis=0),\n",
    "                     'd2udx2_list':np.concatenate(d2udx2_list,axis=0),\n",
    "                     'd2udy2_list':np.concatenate(d2udy2_list,axis=0),\n",
    "                     'd2udxdy_list':np.concatenate(d2udxdy_list,axis=0),\n",
    "                     'laplace_list':np.concatenate(laplace_list,axis=0)}\n",
    "savemat('picn_process_data.mat', picn_process_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cf1d6042",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
